package com.tedu.day02.oop;

/**
 * 抽象类的特点<补充>：
 *   类 ：成员变量/成员方法/构造方法
 *   抽象类：成员变量/成员方法/构造方法
 *   创建抽象类--普通类变成（实现）子类，子类继承抽象类
 *   成员变量：既可以是变量也可以是常量
 *   构造方法：有，用于子类访问调用抽象【父】类的成员变量---赋值
 *   构造方法：既可以抽象，也可以非抽象
 *   抽象方法与非抽象方法出现在抽象类当中的问题：
 *   A：抽象方法  【重写】强制要求子类完成父类抽象方法
 *   B：非抽象方法  【拓展】子类继承的事情，提高代码的复用性
 */
abstract class Foo{
    //成员变量
    public int i=10;
    public final int J=20;//成员变量、常量
    //Java强类型语言：大小写分明
    //public int j=30;
    //构造方法
    public Foo() {
        this(30); //调用本类其他构造器==传参
    }
    public Foo(int i) {
        this.i = i;
    }
    //成员方法:抽象方法
     public abstract void show();
    //成员方法:非抽象方法
    public  void method(){
        System.out.println("Foo    method");
    }
}

//实现(子)类
class Goo extends Foo{

    public void show() {
        System.out.println("Goo   show");
    }
//    public void method(){
//        System.out.println("Goo    method");
//    }
}

public class 抽象类补充 {
    public static void main(String[] args) {
        //抽象类---继承---多态性---使用多态向上造型
       Foo f=new Goo();
        //①实例化---子类构造器，默认存在一个无参构造器，自带super，通过super去调用父类的无参构造器
        //②执行抽象类中的无参构造器，再去调用抽象类中的有参构造器
        //③this调用i，给i重新赋值
        System.out.println(f.i);  //输出i的值 30
        //f.J=48;//不可修改
        System.out.println(f.J);

        //----------
        f.show();  //输出：Goo   show（重写）
        f.method();  //输出：Goo    method（重写）  拓展【子类方法重写】
    }
}
/**
 * 拓展：abstract共存问题
 *
 */
abstract class aoo{
//    private abstract void show();//冲突
  //  public final abstract void show();//冲突
    //public static abstract  void show();//无意义，静态方法需要家语法块
}
